"use strict";
// This is free and unencumbered software released into the public domain
Object.defineProperty(exports, "__esModule", { value: true });
exports.makeNoise4D = void 0;
var shuffle_seed_1 = require("./shuffle_seed");
var NORM_4D = 1.0 / 30.0;
var SQUISH_4D = (Math.sqrt(4 + 1) - 1) / 4;
var STRETCH_4D = (1 / Math.sqrt(4 + 1) - 1) / 4;
function contribution4D(multiplier, xsb, ysb, zsb, wsb) {
    return {
        dx: -xsb - multiplier * SQUISH_4D,
        dy: -ysb - multiplier * SQUISH_4D,
        dz: -zsb - multiplier * SQUISH_4D,
        dw: -wsb - multiplier * SQUISH_4D,
        xsb: xsb,
        ysb: ysb,
        zsb: zsb,
        wsb: wsb,
    };
}
function makeNoise4D(clientSeed) {
    var contributions = [];
    for (var i = 0; i < p4D.length; i += 16) {
        var baseSet = base4D[p4D[i]];
        var previous = null;
        var current = null;
        for (var k = 0; k < baseSet.length; k += 5) {
            current = contribution4D(baseSet[k], baseSet[k + 1], baseSet[k + 2], baseSet[k + 3], baseSet[k + 4]);
            if (previous === null)
                contributions[i / 16] = current;
            else
                previous.next = current;
            previous = current;
        }
        current.next = contribution4D(p4D[i + 1], p4D[i + 2], p4D[i + 3], p4D[i + 4], p4D[i + 5]);
        current.next.next = contribution4D(p4D[i + 6], p4D[i + 7], p4D[i + 8], p4D[i + 9], p4D[i + 10]);
        current.next.next.next = contribution4D(p4D[i + 11], p4D[i + 12], p4D[i + 13], p4D[i + 14], p4D[i + 15]);
    }
    var lookup = [];
    for (var i = 0; i < lookupPairs4D.length; i += 2) {
        lookup[lookupPairs4D[i]] = contributions[lookupPairs4D[i + 1]];
    }
    var perm = new Uint8Array(256);
    var perm4D = new Uint8Array(256);
    var source = new Uint8Array(256);
    for (var i = 0; i < 256; i++)
        source[i] = i;
    var seed = new Uint32Array(1);
    seed[0] = clientSeed;
    seed = shuffle_seed_1.default(shuffle_seed_1.default(shuffle_seed_1.default(seed)));
    for (var i = 255; i >= 0; i--) {
        seed = shuffle_seed_1.default(seed);
        var r = new Uint32Array(1);
        r[0] = (seed[0] + 31) % (i + 1);
        if (r[0] < 0)
            r[0] += i + 1;
        perm[i] = source[r[0]];
        perm4D[i] = perm[i] & 0xfc;
        source[r[0]] = source[i];
    }
    return function (x, y, z, w) {
        var stretchOffset = (x + y + z + w) * STRETCH_4D;
        var xs = x + stretchOffset;
        var ys = y + stretchOffset;
        var zs = z + stretchOffset;
        var ws = w + stretchOffset;
        var xsb = Math.floor(xs);
        var ysb = Math.floor(ys);
        var zsb = Math.floor(zs);
        var wsb = Math.floor(ws);
        var squishOffset = (xsb + ysb + zsb + wsb) * SQUISH_4D;
        var dx0 = x - (xsb + squishOffset);
        var dy0 = y - (ysb + squishOffset);
        var dz0 = z - (zsb + squishOffset);
        var dw0 = w - (wsb + squishOffset);
        var xins = xs - xsb;
        var yins = ys - ysb;
        var zins = zs - zsb;
        var wins = ws - wsb;
        var inSum = xins + yins + zins + wins;
        var hash = (zins - wins + 1) |
            ((yins - zins + 1) << 1) |
            ((yins - wins + 1) << 2) |
            ((xins - yins + 1) << 3) |
            ((xins - zins + 1) << 4) |
            ((xins - wins + 1) << 5) |
            (inSum << 6) |
            ((inSum + wins) << 8) |
            ((inSum + zins) << 11) |
            ((inSum + yins) << 14) |
            ((inSum + xins) << 17);
        var value = 0;
        for (var c = lookup[hash]; c !== undefined; c = c.next) {
            var dx = dx0 + c.dx;
            var dy = dy0 + c.dy;
            var dz = dz0 + c.dz;
            var dw = dw0 + c.dw;
            var attn = 2 - dx * dx - dy * dy - dz * dz - dw * dw;
            if (attn > 0) {
                var px = xsb + c.xsb;
                var py = ysb + c.ysb;
                var pz = zsb + c.zsb;
                var pw = wsb + c.wsb;
                var indexPartA = perm[px & 0xff];
                var indexPartB = perm[(indexPartA + py) & 0xff];
                var indexPartC = perm[(indexPartB + pz) & 0xff];
                var index = perm4D[(indexPartC + pw) & 0xff];
                var valuePart = gradients4D[index] * dx +
                    gradients4D[index + 1] * dy +
                    gradients4D[index + 2] * dz +
                    gradients4D[index + 3] * dw;
                value += attn * attn * attn * attn * valuePart;
            }
        }
        return value * NORM_4D;
    };
}
exports.makeNoise4D = makeNoise4D;
var base4D = [
    [0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1],
    [3, 1, 1, 1, 0, 3, 1, 1, 0, 1, 3, 1, 0, 1, 1, 3, 0, 1, 1, 1, 4, 1, 1, 1, 1],
    [
        1,
        1,
        0,
        0,
        0,
        1,
        0,
        1,
        0,
        0,
        1,
        0,
        0,
        1,
        0,
        1,
        0,
        0,
        0,
        1,
        2,
        1,
        1,
        0,
        0,
        2,
        1,
        0,
        1,
        0,
        2,
        1,
        0,
        0,
        1,
        2,
        0,
        1,
        1,
        0,
        2,
        0,
        1,
        0,
        1,
        2,
        0,
        0,
        1,
        1,
    ],
    [
        3,
        1,
        1,
        1,
        0,
        3,
        1,
        1,
        0,
        1,
        3,
        1,
        0,
        1,
        1,
        3,
        0,
        1,
        1,
        1,
        2,
        1,
        1,
        0,
        0,
        2,
        1,
        0,
        1,
        0,
        2,
        1,
        0,
        0,
        1,
        2,
        0,
        1,
        1,
        0,
        2,
        0,
        1,
        0,
        1,
        2,
        0,
        0,
        1,
        1,
    ],
];
var gradients4D = [
    3,
    1,
    1,
    1,
    1,
    3,
    1,
    1,
    1,
    1,
    3,
    1,
    1,
    1,
    1,
    3,
    -3,
    1,
    1,
    1,
    -1,
    3,
    1,
    1,
    -1,
    1,
    3,
    1,
    -1,
    1,
    1,
    3,
    3,
    -1,
    1,
    1,
    1,
    -3,
    1,
    1,
    1,
    -1,
    3,
    1,
    1,
    -1,
    1,
    3,
    -3,
    -1,
    1,
    1,
    -1,
    -3,
    1,
    1,
    -1,
    -1,
    3,
    1,
    -1,
    -1,
    1,
    3,
    3,
    1,
    -1,
    1,
    1,
    3,
    -1,
    1,
    1,
    1,
    -3,
    1,
    1,
    1,
    -1,
    3,
    -3,
    1,
    -1,
    1,
    -1,
    3,
    -1,
    1,
    -1,
    1,
    -3,
    1,
    -1,
    1,
    -1,
    3,
    3,
    -1,
    -1,
    1,
    1,
    -3,
    -1,
    1,
    1,
    -1,
    -3,
    1,
    1,
    -1,
    -1,
    3,
    -3,
    -1,
    -1,
    1,
    -1,
    -3,
    -1,
    1,
    -1,
    -1,
    -3,
    1,
    -1,
    -1,
    -1,
    3,
    3,
    1,
    1,
    -1,
    1,
    3,
    1,
    -1,
    1,
    1,
    3,
    -1,
    1,
    1,
    1,
    -3,
    -3,
    1,
    1,
    -1,
    -1,
    3,
    1,
    -1,
    -1,
    1,
    3,
    -1,
    -1,
    1,
    1,
    -3,
    3,
    -1,
    1,
    -1,
    1,
    -3,
    1,
    -1,
    1,
    -1,
    3,
    -1,
    1,
    -1,
    1,
    -3,
    -3,
    -1,
    1,
    -1,
    -1,
    -3,
    1,
    -1,
    -1,
    -1,
    3,
    -1,
    -1,
    -1,
    1,
    -3,
    3,
    1,
    -1,
    -1,
    1,
    3,
    -1,
    -1,
    1,
    1,
    -3,
    -1,
    1,
    1,
    -1,
    -3,
    -3,
    1,
    -1,
    -1,
    -1,
    3,
    -1,
    -1,
    -1,
    1,
    -3,
    -1,
    -1,
    1,
    -1,
    -3,
    3,
    -1,
    -1,
    -1,
    1,
    -3,
    -1,
    -1,
    1,
    -1,
    -3,
    -1,
    1,
    -1,
    -1,
    -3,
    -3,
    -1,
    -1,
    -1,
    -1,
    -3,
    -1,
    -1,
    -1,
    -1,
    -3,
    -1,
    -1,
    -1,
    -1,
    -3,
];
var lookupPairs4D = [
    0,
    3,
    1,
    2,
    2,
    3,
    5,
    2,
    6,
    1,
    7,
    1,
    8,
    3,
    9,
    2,
    10,
    3,
    13,
    2,
    16,
    3,
    18,
    3,
    22,
    1,
    23,
    1,
    24,
    3,
    26,
    3,
    33,
    2,
    37,
    2,
    38,
    1,
    39,
    1,
    41,
    2,
    45,
    2,
    54,
    1,
    55,
    1,
    56,
    0,
    57,
    0,
    58,
    0,
    59,
    0,
    60,
    0,
    61,
    0,
    62,
    0,
    63,
    0,
    256,
    3,
    258,
    3,
    264,
    3,
    266,
    3,
    272,
    3,
    274,
    3,
    280,
    3,
    282,
    3,
    2049,
    2,
    2053,
    2,
    2057,
    2,
    2061,
    2,
    2081,
    2,
    2085,
    2,
    2089,
    2,
    2093,
    2,
    2304,
    9,
    2305,
    9,
    2312,
    9,
    2313,
    9,
    16390,
    1,
    16391,
    1,
    16406,
    1,
    16407,
    1,
    16422,
    1,
    16423,
    1,
    16438,
    1,
    16439,
    1,
    16642,
    8,
    16646,
    8,
    16658,
    8,
    16662,
    8,
    18437,
    6,
    18439,
    6,
    18469,
    6,
    18471,
    6,
    18688,
    9,
    18689,
    9,
    18690,
    8,
    18693,
    6,
    18694,
    8,
    18695,
    6,
    18696,
    9,
    18697,
    9,
    18706,
    8,
    18710,
    8,
    18725,
    6,
    18727,
    6,
    131128,
    0,
    131129,
    0,
    131130,
    0,
    131131,
    0,
    131132,
    0,
    131133,
    0,
    131134,
    0,
    131135,
    0,
    131352,
    7,
    131354,
    7,
    131384,
    7,
    131386,
    7,
    133161,
    5,
    133165,
    5,
    133177,
    5,
    133181,
    5,
    133376,
    9,
    133377,
    9,
    133384,
    9,
    133385,
    9,
    133400,
    7,
    133402,
    7,
    133417,
    5,
    133421,
    5,
    133432,
    7,
    133433,
    5,
    133434,
    7,
    133437,
    5,
    147510,
    4,
    147511,
    4,
    147518,
    4,
    147519,
    4,
    147714,
    8,
    147718,
    8,
    147730,
    8,
    147734,
    8,
    147736,
    7,
    147738,
    7,
    147766,
    4,
    147767,
    4,
    147768,
    7,
    147770,
    7,
    147774,
    4,
    147775,
    4,
    149509,
    6,
    149511,
    6,
    149541,
    6,
    149543,
    6,
    149545,
    5,
    149549,
    5,
    149558,
    4,
    149559,
    4,
    149561,
    5,
    149565,
    5,
    149566,
    4,
    149567,
    4,
    149760,
    9,
    149761,
    9,
    149762,
    8,
    149765,
    6,
    149766,
    8,
    149767,
    6,
    149768,
    9,
    149769,
    9,
    149778,
    8,
    149782,
    8,
    149784,
    7,
    149786,
    7,
    149797,
    6,
    149799,
    6,
    149801,
    5,
    149805,
    5,
    149814,
    4,
    149815,
    4,
    149816,
    7,
    149817,
    5,
    149818,
    7,
    149821,
    5,
    149822,
    4,
    149823,
    4,
    149824,
    37,
    149825,
    37,
    149826,
    36,
    149829,
    34,
    149830,
    36,
    149831,
    34,
    149832,
    37,
    149833,
    37,
    149842,
    36,
    149846,
    36,
    149848,
    35,
    149850,
    35,
    149861,
    34,
    149863,
    34,
    149865,
    33,
    149869,
    33,
    149878,
    32,
    149879,
    32,
    149880,
    35,
    149881,
    33,
    149882,
    35,
    149885,
    33,
    149886,
    32,
    149887,
    32,
    150080,
    49,
    150082,
    48,
    150088,
    49,
    150098,
    48,
    150104,
    47,
    150106,
    47,
    151873,
    46,
    151877,
    45,
    151881,
    46,
    151909,
    45,
    151913,
    44,
    151917,
    44,
    152128,
    49,
    152129,
    46,
    152136,
    49,
    152137,
    46,
    166214,
    43,
    166215,
    42,
    166230,
    43,
    166247,
    42,
    166262,
    41,
    166263,
    41,
    166466,
    48,
    166470,
    43,
    166482,
    48,
    166486,
    43,
    168261,
    45,
    168263,
    42,
    168293,
    45,
    168295,
    42,
    168512,
    31,
    168513,
    28,
    168514,
    31,
    168517,
    28,
    168518,
    25,
    168519,
    25,
    280952,
    40,
    280953,
    39,
    280954,
    40,
    280957,
    39,
    280958,
    38,
    280959,
    38,
    281176,
    47,
    281178,
    47,
    281208,
    40,
    281210,
    40,
    282985,
    44,
    282989,
    44,
    283001,
    39,
    283005,
    39,
    283208,
    30,
    283209,
    27,
    283224,
    30,
    283241,
    27,
    283256,
    22,
    283257,
    22,
    297334,
    41,
    297335,
    41,
    297342,
    38,
    297343,
    38,
    297554,
    29,
    297558,
    24,
    297562,
    29,
    297590,
    24,
    297594,
    21,
    297598,
    21,
    299365,
    26,
    299367,
    23,
    299373,
    26,
    299383,
    23,
    299389,
    20,
    299391,
    20,
    299584,
    31,
    299585,
    28,
    299586,
    31,
    299589,
    28,
    299590,
    25,
    299591,
    25,
    299592,
    30,
    299593,
    27,
    299602,
    29,
    299606,
    24,
    299608,
    30,
    299610,
    29,
    299621,
    26,
    299623,
    23,
    299625,
    27,
    299629,
    26,
    299638,
    24,
    299639,
    23,
    299640,
    22,
    299641,
    22,
    299642,
    21,
    299645,
    20,
    299646,
    21,
    299647,
    20,
    299648,
    61,
    299649,
    60,
    299650,
    61,
    299653,
    60,
    299654,
    59,
    299655,
    59,
    299656,
    58,
    299657,
    57,
    299666,
    55,
    299670,
    54,
    299672,
    58,
    299674,
    55,
    299685,
    52,
    299687,
    51,
    299689,
    57,
    299693,
    52,
    299702,
    54,
    299703,
    51,
    299704,
    56,
    299705,
    56,
    299706,
    53,
    299709,
    50,
    299710,
    53,
    299711,
    50,
    299904,
    61,
    299906,
    61,
    299912,
    58,
    299922,
    55,
    299928,
    58,
    299930,
    55,
    301697,
    60,
    301701,
    60,
    301705,
    57,
    301733,
    52,
    301737,
    57,
    301741,
    52,
    301952,
    79,
    301953,
    79,
    301960,
    76,
    301961,
    76,
    316038,
    59,
    316039,
    59,
    316054,
    54,
    316071,
    51,
    316086,
    54,
    316087,
    51,
    316290,
    78,
    316294,
    78,
    316306,
    73,
    316310,
    73,
    318085,
    77,
    318087,
    77,
    318117,
    70,
    318119,
    70,
    318336,
    79,
    318337,
    79,
    318338,
    78,
    318341,
    77,
    318342,
    78,
    318343,
    77,
    430776,
    56,
    430777,
    56,
    430778,
    53,
    430781,
    50,
    430782,
    53,
    430783,
    50,
    431000,
    75,
    431002,
    72,
    431032,
    75,
    431034,
    72,
    432809,
    74,
    432813,
    69,
    432825,
    74,
    432829,
    69,
    433032,
    76,
    433033,
    76,
    433048,
    75,
    433065,
    74,
    433080,
    75,
    433081,
    74,
    447158,
    71,
    447159,
    68,
    447166,
    71,
    447167,
    68,
    447378,
    73,
    447382,
    73,
    447386,
    72,
    447414,
    71,
    447418,
    72,
    447422,
    71,
    449189,
    70,
    449191,
    70,
    449197,
    69,
    449207,
    68,
    449213,
    69,
    449215,
    68,
    449408,
    67,
    449409,
    67,
    449410,
    66,
    449413,
    64,
    449414,
    66,
    449415,
    64,
    449416,
    67,
    449417,
    67,
    449426,
    66,
    449430,
    66,
    449432,
    65,
    449434,
    65,
    449445,
    64,
    449447,
    64,
    449449,
    63,
    449453,
    63,
    449462,
    62,
    449463,
    62,
    449464,
    65,
    449465,
    63,
    449466,
    65,
    449469,
    63,
    449470,
    62,
    449471,
    62,
    449472,
    19,
    449473,
    19,
    449474,
    18,
    449477,
    16,
    449478,
    18,
    449479,
    16,
    449480,
    19,
    449481,
    19,
    449490,
    18,
    449494,
    18,
    449496,
    17,
    449498,
    17,
    449509,
    16,
    449511,
    16,
    449513,
    15,
    449517,
    15,
    449526,
    14,
    449527,
    14,
    449528,
    17,
    449529,
    15,
    449530,
    17,
    449533,
    15,
    449534,
    14,
    449535,
    14,
    449728,
    19,
    449729,
    19,
    449730,
    18,
    449734,
    18,
    449736,
    19,
    449737,
    19,
    449746,
    18,
    449750,
    18,
    449752,
    17,
    449754,
    17,
    449784,
    17,
    449786,
    17,
    451520,
    19,
    451521,
    19,
    451525,
    16,
    451527,
    16,
    451528,
    19,
    451529,
    19,
    451557,
    16,
    451559,
    16,
    451561,
    15,
    451565,
    15,
    451577,
    15,
    451581,
    15,
    451776,
    19,
    451777,
    19,
    451784,
    19,
    451785,
    19,
    465858,
    18,
    465861,
    16,
    465862,
    18,
    465863,
    16,
    465874,
    18,
    465878,
    18,
    465893,
    16,
    465895,
    16,
    465910,
    14,
    465911,
    14,
    465918,
    14,
    465919,
    14,
    466114,
    18,
    466118,
    18,
    466130,
    18,
    466134,
    18,
    467909,
    16,
    467911,
    16,
    467941,
    16,
    467943,
    16,
    468160,
    13,
    468161,
    13,
    468162,
    13,
    468163,
    13,
    468164,
    13,
    468165,
    13,
    468166,
    13,
    468167,
    13,
    580568,
    17,
    580570,
    17,
    580585,
    15,
    580589,
    15,
    580598,
    14,
    580599,
    14,
    580600,
    17,
    580601,
    15,
    580602,
    17,
    580605,
    15,
    580606,
    14,
    580607,
    14,
    580824,
    17,
    580826,
    17,
    580856,
    17,
    580858,
    17,
    582633,
    15,
    582637,
    15,
    582649,
    15,
    582653,
    15,
    582856,
    12,
    582857,
    12,
    582872,
    12,
    582873,
    12,
    582888,
    12,
    582889,
    12,
    582904,
    12,
    582905,
    12,
    596982,
    14,
    596983,
    14,
    596990,
    14,
    596991,
    14,
    597202,
    11,
    597206,
    11,
    597210,
    11,
    597214,
    11,
    597234,
    11,
    597238,
    11,
    597242,
    11,
    597246,
    11,
    599013,
    10,
    599015,
    10,
    599021,
    10,
    599023,
    10,
    599029,
    10,
    599031,
    10,
    599037,
    10,
    599039,
    10,
    599232,
    13,
    599233,
    13,
    599234,
    13,
    599235,
    13,
    599236,
    13,
    599237,
    13,
    599238,
    13,
    599239,
    13,
    599240,
    12,
    599241,
    12,
    599250,
    11,
    599254,
    11,
    599256,
    12,
    599257,
    12,
    599258,
    11,
    599262,
    11,
    599269,
    10,
    599271,
    10,
    599272,
    12,
    599273,
    12,
    599277,
    10,
    599279,
    10,
    599282,
    11,
    599285,
    10,
    599286,
    11,
    599287,
    10,
    599288,
    12,
    599289,
    12,
    599290,
    11,
    599293,
    10,
    599294,
    11,
    599295,
    10,
];
var p4D = [
    0,
    0,
    1,
    -1,
    0,
    0,
    0,
    1,
    0,
    -1,
    0,
    0,
    1,
    0,
    0,
    -1,
    0,
    0,
    -1,
    1,
    0,
    0,
    0,
    0,
    1,
    -1,
    0,
    0,
    0,
    1,
    0,
    -1,
    0,
    0,
    -1,
    0,
    1,
    0,
    0,
    0,
    -1,
    1,
    0,
    0,
    0,
    0,
    1,
    -1,
    0,
    0,
    -1,
    0,
    0,
    1,
    0,
    0,
    -1,
    0,
    1,
    0,
    0,
    0,
    -1,
    1,
    0,
    2,
    1,
    1,
    0,
    0,
    1,
    1,
    1,
    -1,
    0,
    1,
    1,
    1,
    0,
    -1,
    0,
    2,
    1,
    0,
    1,
    0,
    1,
    1,
    -1,
    1,
    0,
    1,
    1,
    0,
    1,
    -1,
    0,
    2,
    0,
    1,
    1,
    0,
    1,
    -1,
    1,
    1,
    0,
    1,
    0,
    1,
    1,
    -1,
    0,
    2,
    1,
    0,
    0,
    1,
    1,
    1,
    -1,
    0,
    1,
    1,
    1,
    0,
    -1,
    1,
    0,
    2,
    0,
    1,
    0,
    1,
    1,
    -1,
    1,
    0,
    1,
    1,
    0,
    1,
    -1,
    1,
    0,
    2,
    0,
    0,
    1,
    1,
    1,
    -1,
    0,
    1,
    1,
    1,
    0,
    -1,
    1,
    1,
    1,
    4,
    2,
    1,
    1,
    0,
    4,
    1,
    2,
    1,
    0,
    4,
    1,
    1,
    2,
    0,
    1,
    4,
    2,
    1,
    0,
    1,
    4,
    1,
    2,
    0,
    1,
    4,
    1,
    1,
    0,
    2,
    1,
    4,
    2,
    0,
    1,
    1,
    4,
    1,
    0,
    2,
    1,
    4,
    1,
    0,
    1,
    2,
    1,
    4,
    0,
    2,
    1,
    1,
    4,
    0,
    1,
    2,
    1,
    4,
    0,
    1,
    1,
    2,
    1,
    2,
    1,
    1,
    0,
    0,
    3,
    2,
    1,
    0,
    0,
    3,
    1,
    2,
    0,
    0,
    1,
    2,
    1,
    0,
    1,
    0,
    3,
    2,
    0,
    1,
    0,
    3,
    1,
    0,
    2,
    0,
    1,
    2,
    0,
    1,
    1,
    0,
    3,
    0,
    2,
    1,
    0,
    3,
    0,
    1,
    2,
    0,
    1,
    2,
    1,
    0,
    0,
    1,
    3,
    2,
    0,
    0,
    1,
    3,
    1,
    0,
    0,
    2,
    1,
    2,
    0,
    1,
    0,
    1,
    3,
    0,
    2,
    0,
    1,
    3,
    0,
    1,
    0,
    2,
    1,
    2,
    0,
    0,
    1,
    1,
    3,
    0,
    0,
    2,
    1,
    3,
    0,
    0,
    1,
    2,
    2,
    3,
    1,
    1,
    1,
    0,
    2,
    1,
    1,
    1,
    -1,
    2,
    2,
    0,
    0,
    0,
    2,
    3,
    1,
    1,
    0,
    1,
    2,
    1,
    1,
    -1,
    1,
    2,
    2,
    0,
    0,
    0,
    2,
    3,
    1,
    0,
    1,
    1,
    2,
    1,
    -1,
    1,
    1,
    2,
    2,
    0,
    0,
    0,
    2,
    3,
    1,
    1,
    1,
    0,
    2,
    1,
    1,
    1,
    -1,
    2,
    0,
    2,
    0,
    0,
    2,
    3,
    1,
    1,
    0,
    1,
    2,
    1,
    1,
    -1,
    1,
    2,
    0,
    2,
    0,
    0,
    2,
    3,
    0,
    1,
    1,
    1,
    2,
    -1,
    1,
    1,
    1,
    2,
    0,
    2,
    0,
    0,
    2,
    3,
    1,
    1,
    1,
    0,
    2,
    1,
    1,
    1,
    -1,
    2,
    0,
    0,
    2,
    0,
    2,
    3,
    1,
    0,
    1,
    1,
    2,
    1,
    -1,
    1,
    1,
    2,
    0,
    0,
    2,
    0,
    2,
    3,
    0,
    1,
    1,
    1,
    2,
    -1,
    1,
    1,
    1,
    2,
    0,
    0,
    2,
    0,
    2,
    3,
    1,
    1,
    0,
    1,
    2,
    1,
    1,
    -1,
    1,
    2,
    0,
    0,
    0,
    2,
    2,
    3,
    1,
    0,
    1,
    1,
    2,
    1,
    -1,
    1,
    1,
    2,
    0,
    0,
    0,
    2,
    2,
    3,
    0,
    1,
    1,
    1,
    2,
    -1,
    1,
    1,
    1,
    2,
    0,
    0,
    0,
    2,
    2,
    1,
    1,
    1,
    -1,
    0,
    1,
    1,
    1,
    0,
    -1,
    0,
    0,
    0,
    0,
    0,
    2,
    1,
    1,
    -1,
    1,
    0,
    1,
    1,
    0,
    1,
    -1,
    0,
    0,
    0,
    0,
    0,
    2,
    1,
    -1,
    1,
    1,
    0,
    1,
    0,
    1,
    1,
    -1,
    0,
    0,
    0,
    0,
    0,
    2,
    1,
    1,
    -1,
    0,
    1,
    1,
    1,
    0,
    -1,
    1,
    0,
    0,
    0,
    0,
    0,
    2,
    1,
    -1,
    1,
    0,
    1,
    1,
    0,
    1,
    -1,
    1,
    0,
    0,
    0,
    0,
    0,
    2,
    1,
    -1,
    0,
    1,
    1,
    1,
    0,
    -1,
    1,
    1,
    0,
    0,
    0,
    0,
    0,
    2,
    1,
    1,
    1,
    -1,
    0,
    1,
    1,
    1,
    0,
    -1,
    2,
    2,
    0,
    0,
    0,
    2,
    1,
    1,
    -1,
    1,
    0,
    1,
    1,
    0,
    1,
    -1,
    2,
    2,
    0,
    0,
    0,
    2,
    1,
    1,
    -1,
    0,
    1,
    1,
    1,
    0,
    -1,
    1,
    2,
    2,
    0,
    0,
    0,
    2,
    1,
    1,
    1,
    -1,
    0,
    1,
    1,
    1,
    0,
    -1,
    2,
    0,
    2,
    0,
    0,
    2,
    1,
    -1,
    1,
    1,
    0,
    1,
    0,
    1,
    1,
    -1,
    2,
    0,
    2,
    0,
    0,
    2,
    1,
    -1,
    1,
    0,
    1,
    1,
    0,
    1,
    -1,
    1,
    2,
    0,
    2,
    0,
    0,
    2,
    1,
    1,
    -1,
    1,
    0,
    1,
    1,
    0,
    1,
    -1,
    2,
    0,
    0,
    2,
    0,
    2,
    1,
    -1,
    1,
    1,
    0,
    1,
    0,
    1,
    1,
    -1,
    2,
    0,
    0,
    2,
    0,
    2,
    1,
    -1,
    0,
    1,
    1,
    1,
    0,
    -1,
    1,
    1,
    2,
    0,
    0,
    2,
    0,
    2,
    1,
    1,
    -1,
    0,
    1,
    1,
    1,
    0,
    -1,
    1,
    2,
    0,
    0,
    0,
    2,
    2,
    1,
    -1,
    1,
    0,
    1,
    1,
    0,
    1,
    -1,
    1,
    2,
    0,
    0,
    0,
    2,
    2,
    1,
    -1,
    0,
    1,
    1,
    1,
    0,
    -1,
    1,
    1,
    2,
    0,
    0,
    0,
    2,
    3,
    1,
    1,
    0,
    0,
    0,
    2,
    2,
    0,
    0,
    0,
    2,
    1,
    1,
    1,
    -1,
    3,
    1,
    0,
    1,
    0,
    0,
    2,
    0,
    2,
    0,
    0,
    2,
    1,
    1,
    1,
    -1,
    3,
    1,
    0,
    0,
    1,
    0,
    2,
    0,
    0,
    2,
    0,
    2,
    1,
    1,
    1,
    -1,
    3,
    1,
    1,
    0,
    0,
    0,
    2,
    2,
    0,
    0,
    0,
    2,
    1,
    1,
    -1,
    1,
    3,
    1,
    0,
    1,
    0,
    0,
    2,
    0,
    2,
    0,
    0,
    2,
    1,
    1,
    -1,
    1,
    3,
    1,
    0,
    0,
    0,
    1,
    2,
    0,
    0,
    0,
    2,
    2,
    1,
    1,
    -1,
    1,
    3,
    1,
    1,
    0,
    0,
    0,
    2,
    2,
    0,
    0,
    0,
    2,
    1,
    -1,
    1,
    1,
    3,
    1,
    0,
    0,
    1,
    0,
    2,
    0,
    0,
    2,
    0,
    2,
    1,
    -1,
    1,
    1,
    3,
    1,
    0,
    0,
    0,
    1,
    2,
    0,
    0,
    0,
    2,
    2,
    1,
    -1,
    1,
    1,
    3,
    1,
    0,
    1,
    0,
    0,
    2,
    0,
    2,
    0,
    0,
    2,
    -1,
    1,
    1,
    1,
    3,
    1,
    0,
    0,
    1,
    0,
    2,
    0,
    0,
    2,
    0,
    2,
    -1,
    1,
    1,
    1,
    3,
    1,
    0,
    0,
    0,
    1,
    2,
    0,
    0,
    0,
    2,
    2,
    -1,
    1,
    1,
    1,
    3,
    3,
    2,
    1,
    0,
    0,
    3,
    1,
    2,
    0,
    0,
    4,
    1,
    1,
    1,
    1,
    3,
    3,
    2,
    0,
    1,
    0,
    3,
    1,
    0,
    2,
    0,
    4,
    1,
    1,
    1,
    1,
    3,
    3,
    0,
    2,
    1,
    0,
    3,
    0,
    1,
    2,
    0,
    4,
    1,
    1,
    1,
    1,
    3,
    3,
    2,
    0,
    0,
    1,
    3,
    1,
    0,
    0,
    2,
    4,
    1,
    1,
    1,
    1,
    3,
    3,
    0,
    2,
    0,
    1,
    3,
    0,
    1,
    0,
    2,
    4,
    1,
    1,
    1,
    1,
    3,
    3,
    0,
    0,
    2,
    1,
    3,
    0,
    0,
    1,
    2,
    4,
    1,
    1,
    1,
    1,
    3,
    3,
    2,
    1,
    0,
    0,
    3,
    1,
    2,
    0,
    0,
    2,
    1,
    1,
    1,
    -1,
    3,
    3,
    2,
    0,
    1,
    0,
    3,
    1,
    0,
    2,
    0,
    2,
    1,
    1,
    1,
    -1,
    3,
    3,
    0,
    2,
    1,
    0,
    3,
    0,
    1,
    2,
    0,
    2,
    1,
    1,
    1,
    -1,
    3,
    3,
    2,
    1,
    0,
    0,
    3,
    1,
    2,
    0,
    0,
    2,
    1,
    1,
    -1,
    1,
    3,
    3,
    2,
    0,
    0,
    1,
    3,
    1,
    0,
    0,
    2,
    2,
    1,
    1,
    -1,
    1,
    3,
    3,
    0,
    2,
    0,
    1,
    3,
    0,
    1,
    0,
    2,
    2,
    1,
    1,
    -1,
    1,
    3,
    3,
    2,
    0,
    1,
    0,
    3,
    1,
    0,
    2,
    0,
    2,
    1,
    -1,
    1,
    1,
    3,
    3,
    2,
    0,
    0,
    1,
    3,
    1,
    0,
    0,
    2,
    2,
    1,
    -1,
    1,
    1,
    3,
    3,
    0,
    0,
    2,
    1,
    3,
    0,
    0,
    1,
    2,
    2,
    1,
    -1,
    1,
    1,
    3,
    3,
    0,
    2,
    1,
    0,
    3,
    0,
    1,
    2,
    0,
    2,
    -1,
    1,
    1,
    1,
    3,
    3,
    0,
    2,
    0,
    1,
    3,
    0,
    1,
    0,
    2,
    2,
    -1,
    1,
    1,
    1,
    3,
    3,
    0,
    0,
    2,
    1,
    3,
    0,
    0,
    1,
    2,
    2,
    -1,
    1,
    1,
    1,
];
